/**
 * 
 */
package gwtool.backend.updater;

import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.net.URLDecoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.swing.JOptionPane;

/**
 * @author Chrisitan
 * @since 5.0.3
 */
public class CommUtilities {

	/**
	 * 
	 */
	private String serverUrlUpdater = "https://alarmapp.chrku.de/gwtool/updater/";

	/**
	 * 
	 */
	private String serverUrl = "https://alarmapp.chrku.de/gwtool/updater/";

	/**
	 * 
	 */
	public CommUtilities() {

	}

	/**
	 * 
	 * @return Gibt die ServerUrl zurück
	 */
	public String getServerUrl() {

		return serverUrl;
	}

	/**
	 * 
	 * @return the serverUrlUpdater
	 */
	public String getServerUrlUpdater() {

		return serverUrlUpdater;
	}

	/**
	 * Vergleicht die md5 checksumme mit der vom Server
	 * 
	 * @param path
	 *            Der Path zum localen heldenUpdater
	 * @return true wenn der md5hash dem aus den Daten vom Server übereinstimmt.
	 * 
	 * @since 5.0.3
	 */
	public String checkDateiMd5(File path) {

		MessageDigest md;
		String localMd5 = "";
		try {
			if (!path.exists() || path.isDirectory()) {
				return "<File not found>";
			}
			md = MessageDigest.getInstance("MD5");
			InputStream is = new FileInputStream(path);
			byte[] buffer = new byte[8192];
			int read = 0;
			while ((read = is.read(buffer)) > 0) {
				md.update(buffer, 0, read);
			}
			byte[] md5 = md.digest();
			BigInteger bi = new BigInteger(1, md5);
			localMd5 = bi.toString(16);
			for (; localMd5.length() < 32;) {
				localMd5 = "0" + localMd5;
			}
			is.close();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return localMd5;
	}

	/**
	 * Diese Methode ersetzt alle zeichen die nich a-z, A-Z, 0-9, ., ensprechen
	 * mit _ und führt auch trim aus
	 * 
	 * @param path
	 *            Der zu ünderne String
	 * @return angepasster string
	 */
	public static String replaceAllEvil(String path) {

		StringBuffer buffer = new StringBuffer();
		path = path.trim();
		for (int i = 0; i < path.length(); i++) {
			char c = path.charAt(i);
			if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == ' ' || c == '.') {
				buffer.append(c);
			} else {
				buffer.append("_");
			}
		}
		return buffer.toString();
	}

	/**
	 * 
	 * @return jarpath
	 */
	public File getJarPath() {

		File jar;
		try {
			jar = new File(URLDecoder.decode(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(),
					"UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			jar = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
		}
		return jar;
	}

	/**
	 * 
	 * @param url
	 *            Url
	 * @return xxx
	 */
	public static boolean showInBrowser(String url) {

		try {
			// Die Deskatop-API wird nur unter Windows und Gnome unterstützt
			if (Desktop.isDesktopSupported()) {
				Desktop desktop = Desktop.getDesktop();
				if (desktop.isSupported(Desktop.Action.BROWSE)) {
					desktop.browse(new URI(url));
					return true;
				}
			} else {
				if (showInBrowserFallBack(url)) {
					return true;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		JOptionPane.showMessageDialog(null, "Ich habe keinen Browser gefunden,\n" + "um die folgende Webseite zu öffnen:\n"
				+ url + "\n" + "Bitte nehmen sie Kontakt zu den Programmieren auf,\ndamit wir das Problem "
				+ "beheben können.");
		return false;
	}

	/** */
	static final String[] FAILBACKLINUXBROWSERS = { "xdg-open", "x-www-browser", "google-chrome", "firefox", "opera",
			"epiphany", "konqueror", "conkeror", "midori", "kazehakase", "mozilla" };

	/**
	 * Bare Bones Browser Launch // // Version 3.1 (June 6, 2010) // // By Dem
	 * Pilafian // // Supports: // // Mac OS X, GNU/Linux, Unix, Windows
	 * XP/Vista/7 // // Public Domain Software -- Free to Use as You Like *
	 * 
	 * @param url
	 *            Url
	 * @return true, wenn ein Browser gestartet wurde
	 * @exception Exception
	 *                Fehler
	 */
	private static boolean showInBrowserFallBack(String url) throws Exception {

		String osName = System.getProperty("os.name");
		if (osName.startsWith("Mac OS")) {
			Class.forName("com.apple.eio.FileManager").getDeclaredMethod("openURL", new Class[] { String.class })
					.invoke(null, new Object[] { url });
			return true;
		}
		if (osName.startsWith("Windows")) {
			Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
			return true;
		}
		for (String b : FAILBACKLINUXBROWSERS) {
			// Existiert der Browser?
			int err = Runtime.getRuntime().exec(new String[] { "which", b }).getInputStream().read();
			// Wenn ja, nutzen
			if (err > 0) {
				Runtime.getRuntime().exec(new String[] { b, url });
				return true;
			}
		}
		return false;
	}
}